iT邦幫忙

2025 iThome 鐵人賽

DAY 27
0
佛心分享-SideProject30

從零開始改善工作之 Chrome Extension: MR 通知文字小工具系列 第 27

Day 27:效能思考 — Content Script 何時注入最好?

  • 分享至 

  • xImage
  •  

為什麼要在意注入時機?

Content Script 是在使用者造訪符合條件的頁面時注入的 JavaScript 腳本。
若設定不當,可能造成:

  • 頁面載入變慢(太早注入、DOM 尚未就緒)
  • 功能失效(太晚注入、DOM 已被動態重寫)
  • 資源浪費(在不必要的頁面執行)

因此,最佳化注入時機 可以 extension 更穩定、快速,也更節省資源。

manifest.json 設定注入時機(run_at)

在 manifest.json 的 content_scripts 設定中,可以加上 run_at 屬性來指定注入時機
例如:

{
  "content_scripts": [
    {
      "matches": ["https://gitlab.com/*"],
      "js": ["contentScript.js"],
      "run_at": "document_idle"
    }
  ]
}
注入時機 適用情境
document_start 在 HTML 解析開始時注入 想要攔截或修改網頁載入流程(如刪除追蹤 script)
document_end 在 DOM 建立完成但資源尚未完全載入時注入 想操作初始 DOM(如插入按鈕、監聽事件)
document_idle 頁面載入完成後(預設) 大部分情況,尤其是 UX 類功能(避免干擾頁面載入)

動態注入方式(提升效能)

除了在 manifest.json 靜態定義外,也可以透過 chrome.scripting.executeScript() 動態注入 Content Script,這樣可以避免在所有分頁自動注入,提高效能。
例如:

// background.js
chrome.action.onClicked.addListener((tab) => {
  chrome.scripting.executeScript({
    target: { tabId: tab.id },
    files: ['contentScript.js']
  });
});

優點:

  • 只在使用者觸發時注入(例如點擊擴充圖示)
  • 減少對所有頁面的負擔
  • 避免非目標頁面被誤注入

適用場景:

  • 擴充功能不是「長駐型」的(如自動提示)
  • 只需偶爾分析頁面資料

補充建議

  • 避免過度監聽事件:如 MutationObserver 或 setInterval 若未清理會造成效能耗損。
  • 限制匹配範圍:matches 僅列出必要網域(例如:https://gitlab.com/*),不要用 *://*/*
  • 使用 background 管理狀態:避免在 content script 儲存過多狀態資料,減少記憶體占用。

參考來源


上一篇
Day 26:延伸應用 — 結合 Shortcut(快捷鍵)
系列文
從零開始改善工作之 Chrome Extension: MR 通知文字小工具27
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言